//package com.tian.mall;
//
//import com.sun.mail.util.MailSSLSocketFactory;
//import freemarker.template.Template;
//import org.apache.commons.lang3.StringUtils;
//import org.apache.commons.lang3.time.DateFormatUtils;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.core.io.FileSystemResource;
//import org.springframework.mail.SimpleMailMessage;
//import org.springframework.mail.javamail.JavaMailSenderImpl;
//import org.springframework.mail.javamail.MimeMessageHelper;
//import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
//import org.springframework.stereotype.Component;
//import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
//import org.springframework.util.Assert;
//import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
//
//import javax.annotation.PostConstruct;
//import javax.annotation.Resource;
//import javax.mail.internet.MimeMessage;
//import java.io.File;
//import java.nio.charset.StandardCharsets;
//import java.security.GeneralSecurityException;
//import java.util.Date;
//import java.util.Properties;
//
//
///**
// * @author zhumengping
// * @title: EmailSendUtils
// * @projectName zhump-cloud
// * @date 2023/8/1 17:44
// */
//@Component
//public class EmailSendUtils {
//
//    private static final Logger log = LoggerFactory.getLogger(EmailSendUtils.class);
//
//    private static final String CHARSET_DEFAULT_ENCODING = "utf-8";
//
//
//    private JavaMailSenderImpl javaMailSender;
//    private MimeMessage message;
//
//    @Value("${spring.mail.username}")
//    private String userName;
//
//    @Value("${spring.mail.host}")
//    private String host;
//
//    @Value("${spring.mail.password}")
//    private String password;
//
//
//    @Autowired
//    private FreeMarkerConfigurer freeMarkerConfigurer;
//
//    @Resource(name = "taskExecutor")
//    ThreadPoolTaskExecutor threadPoolTaskExecutor;
//
//    /**
//     * 初始化参数
//     * @author zhump
//     */
//    @PostConstruct
//    public void initConfigurer(){
//
//        javaMailSender = new JavaMailSenderImpl();
//        javaMailSender.setHost(host);
//        javaMailSender.setUsername(userName);
//        javaMailSender.setPassword(password);
//        javaMailSender.setDefaultEncoding(StandardCharsets.UTF_8.toString());
//
//
//        Properties props = new Properties();
//        // 设置服务器
//        props.setProperty("mail.transport.protocol", "smtp");
//        props.setProperty("mail.smtp.host", host);
//        props.setProperty("mail.smtp.port", "465");
//        props.setProperty("mail.smtp.auth", "true");
//        props.put("mail.smtp.ssl.enable", "true");
//        // 开启安全协议
//        MailSSLSocketFactory sf = null;
//        try {
//            sf = new MailSSLSocketFactory();
//            sf.setTrustAllHosts(true);
//        } catch (GeneralSecurityException e1) {
//            e1.printStackTrace();
//        }
//        props.put("mail.smtp.ssl.socketFactory", sf);
//        javaMailSender.setJavaMailProperties(props);
//        //获取 MimeMessage
//        message = javaMailSender.createMimeMessage();
//    }
//
//
//    /**
//     * 单用户发送，只发送一个账户
//     * @param account 接收账户
//     * @param subject 发送主题
//     * @param content 发送内容
//     * @author zhump
//     * @date 2021/9/28 14:52
//     * @throws
//     */
//    public void normalMail(String account,String subject,String content){
//        String[] to = {account};
//        this.normalMail(to,subject,content);
//    }
//
//    /**
//     *  普通邮件发送多用户
//     * @param account 接收账户
//     * @param subject 发送主题
//     * @param content 发送内容
//     * @author zhump
//     * @date 2021/9/28 15:09
//     * @throws
//     */
//    public void normalMail(String[] account,String subject,String content){
//        log.info("mail send start date:{}", DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss"));
//        log.info("请求参数,接收账户:{},邮件主题:[{}],发送内容:[{}]",account,subject,content);
//        //必要参数判断
//        Assert.isTrue(account != null && account.length != 0,"发送账户不能为空");
//        Assert.isTrue(StringUtils.isNotBlank(subject),"发送主题不能为空");
//        Assert.isTrue(StringUtils.isNotBlank(content),"发送内容不能为空");
//        SimpleMailMessage mailMessage = new SimpleMailMessage();
//        //发送邮件账户校验，应与配置账户一致
//        mailMessage.setFrom(userName);
//        //接受邮件账户
//        mailMessage.setTo(account);
//        //发送主题
//        mailMessage.setSubject(subject);
//        //邮件内容
//        mailMessage.setText(content);
//        //发送时间
//        mailMessage.setSentDate(new Date());
//        javaMailSender.send(mailMessage);
//        log.info("邮件发送结束时间:{}", DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss"));
//    }
//
//    /**
//     * 带附件邮件发送单用户
//     * @param file 附件：
//     * @param account 接受账户
//     * @param subject 发送主题
//     * @param content 发送内容
//     * @author zhump
//     * @date 2021/9/28 15:36
//     * @throws
//     */
//    public void appendixMail(File file, String account, String subject, String content)throws Exception{
//        String[] to = {account};
//        this.appendixMail(file,to,subject,content);
//    }
//
//    /**
//     * 带附件邮件发送多用户发送
//     * @param file 附件
//     * @param account 接收账户
//     * @param subject 发送主题
//     * @param content 发送内容
//     * @author zhump
//     * @date 2021/9/28 15:55
//     * @throws  Exception
//     */
//    public void appendixMail(File file,String[] account,String subject,String content) throws Exception{
//        //log.info("请求参数,接受账户:{},邮件主题:[{}],发送内容:[{}]",account,subject,content);
//        Assert.isTrue(account != null && account.length != 0,"发送账户不能为空");
//        Assert.isTrue(StringUtils.isNotBlank(subject),"发送主题不能为空");
//        Assert.isTrue(StringUtils.isNotBlank(content),"发送内容不能为空");
//        MimeMessageHelper helper =new MimeMessageHelper(message,true,CHARSET_DEFAULT_ENCODING);
//        //发送账户
//        helper.setFrom(userName);
//        //接受账户
//        helper.setTo(account);
//        //发送主题
//        helper.setSubject(subject);
//        //发送内容
//        helper.setText(content);
//        //发送附件
//        FileSystemResource resource = new FileSystemResource(file);
//        helper.addAttachment(file.getName(), resource);
//        javaMailSender.send(message);
//
//    }
//
//    /**
//     * 此方法为html方式发送
//     * <pre>
//     *     content 为广告内容，内容为一段html标签页
//     *     eg:<html><div class="logo><h1>此页面为内容页</></></html>
//     * </pre>
//     * @param account 接收账户
//     * @param content 发送内容
//     * @author zhump
//     * @date 2021/9/29 14:39
//     * @throws Exception
//     */
//    public void sendHtmlMail(String account,EmailSendEntity obj,String content) throws Exception{
//        //注意这里使用的是MimeMessage
//        MimeMessageHelper helper = new MimeMessageHelper(message, true,CHARSET_DEFAULT_ENCODING);
//        //发送者账号
//        helper.setFrom(userName);
//        //接收者账号
//        helper.setTo(account);
//        //发送主题
//        helper.setSubject(obj.getSubject());
//        //第二个参数：格式是否为html
//        helper.setText(content, false);
//        javaMailSender.send(message);
//    }
//
//    /**
//     * 此方法为html方式发送
//     * <pre>
//     *     content 为广告内容，内容为一段html标签页
//     *     eg:<html><div class="logo><h1>此页面为内容页</></></html>
//     * </pre>
//     * @param account 接收账户
//     * @param content 发送内容
//     * @author zhump
//     * @date 2021/9/29 14:39
//     * @throws Exception
//     */
//    public void sendHtmlMailTest(String account,EmailSendEntity send,String content) throws Exception{
//        //注意这里使用的是MimeMessage
//        MimeMessageHelper helper = new MimeMessageHelper(message, true,CHARSET_DEFAULT_ENCODING);
//        //发送者账号
//        helper.setFrom(userName);
//        //接收者账号
//        helper.setTo(account);
//        //发送主题
//        helper.setSubject(send.getSubject());
//        //第二个参数：格式是否为html
//        helper.setText(content, true);
//        javaMailSender.send(message);
//    }
//
//    /**
//     * 此方法为模板方式发送
//     * <pre>
//     *     1:根据模板进行发送消息，底层实际还是走的html发送;
//     *     2:模板内容可以自己定义，在templates目录下面;
//     *     3：图片建议采用正式环境的地址，因为此消息是发送到邮件内容里面，
//     *     如果是相对路径，可能在邮件箱找不到该图片logo的图片地址;
//     * </pre>
//     *
//     * @param account 接收账号
//     * @param template html 模板
//     * @author zhump
//     * @date 2021/9/29 17:56
//     * @throws Exception
//     */
//    public void sendTemplateMail(String account, EmailSendEntity obj, String template) throws Exception{
//        //log.info("请求参数,接收账户:{},发送内容:-->{},发送模板:-->{}",account, JSONObject.toJSONString(obj),template);
//        Assert.isTrue(StringUtils.isNotBlank(account),"接收账户不能为空");
//        Assert.isTrue(StringUtils.isNotBlank(template),"发送模板不能为空");
//        // 获得模板
//        Template template1 = freeMarkerConfigurer.getConfiguration().getTemplate(template,CHARSET_DEFAULT_ENCODING);
//        // 传入数据模型到模板，替代模板中的占位符，并将模板转化为html字符串
//        String templateHtml = FreeMarkerTemplateUtils.processTemplateIntoString(template1,obj);
//        // 该方法本质上还是发送html邮件，调用之前发送html邮件的方法
//        this.sendHtmlMailTest(account, obj, templateHtml);
//    }
//
//    /**
//     * 此方法为模板方式发送--异步发送
//     * <pre>
//     *     1:根据模板进行发送消息，底层实际还是走的html发送;
//     *     2:模板内容可以自己定义，在templates目录下面;
//     *     3：图片建议采用正式环境的地址，因为此消息是发送到邮件内容里面，
//     *     如果是相对路径，可能在邮件箱找不到该图片logo的图片地址;
//     * </pre>
//     *
//     * @param account 接收账号
//     * @param template html 模板
//     * @author zhump
//     * @date 2021/9/29 17:56
//     * @throws Exception
//     */
//    public void threadSend(String account, EmailSendEntity jdEmailSendResponse, String template) {
//        threadPoolTaskExecutor.execute(()->{
//            try {
//                this.sendTemplateMail(account,jdEmailSendResponse,template);
//            } catch (Exception e){
//                log.error("threadSend account:{};jdEmailSendResponse:{};template:{};message:{}",
//                        account,jdEmailSendResponse,template,e);
//            }
//        });
//    }
//}
